% !Mode:: "TeX:UTF-8"
\section{空域滤波}

\subsection{问题}

\begin{enumerate}
 \item 寻找（或开发）一个加高斯噪声程序。需要具有设定均值和方差功能
 \item 寻找（或开发）一个加椒盐噪声程序。需要具有设定黑白二者出现几率的功能
 \item 开发一个空域均值滤波器 可以特定为$3 \times 3$模板， 但是系数要求可变
 \item 开发一个空域$3 \times 3$中值滤波器， 并比较与均值滤波器的不同
\end{enumerate}


%\subsection[背景原理]{背景原理}
%\subsubsection{高斯噪声与椒盐噪声}
%XXXXXXX



\subsection{程序代码说明}

\subsubsection{高斯噪声发生器设计}

因为需要实现多种噪声发生器， 所以先设计一个噪声发生器框架。

\begin{lstlisting}
class Noise_Gen(object):

    def __init__(self):pass

    def generator(self):pass

    def __call__(self,image):
        self.image =  copy_image(image)
        self.generator()
        return self.image
\end{lstlisting}

其中，generator是需要在每一个派生类里面实现的虚函数，实现具体的噪声发生机制。 同时重载了\_\_call\_\_运算符，故此系列类型的对象可以如函数一样被调用，输入一幅原图像，输出为加入噪声后的图像。

高斯噪声发生器代码如下:

\begin{lstlisting}
class Gaussian(Noise_Gen):
    def __init__(self,m=0,v=1):
        super(self.__class__,self).__init__()
        self.m=m　#`均值`
        self.v=v　#`方差`
    def generator(self):
        self.normal = normal(self.m,self.v,self.image.width*self.image.height)
        for y in range(self.image.height):
            for x in range(self.image.width):
                        self.image[y,x]+=self.normal[y*self.image.height+x]
\end{lstlisting}

其构造函数的两个参数m,v分别为高斯函数的均值和方差。噪声发生函数generator中，调用了numpy中的normal函数，其作用是通过给定的均值和方差，生成 n点满足正态分布的序列。在本函数中生成image.width$\times$image.height个采样点。然后依次加到原图像上。

\subsubsection{椒盐噪声发生器设计}

椒盐噪声发生器代码如下:

\begin{lstlisting}
class Salt_Pepper(Noise_Gen):
    def __init__(self,s=0.02,p=0.02):
        super(self.__class__,self).__init__()
        self.s=s
        self.p=p

    def generator(self):
        for y in range(self.image.height):
            for x in range(self.image.width):
                if random() <self.s:
                    self.image[y,x] = 255
                if random() < self.p:
                    self.image[y,x] = 0
\end{lstlisting}

其中，构造函数参数s为白色点的出现几率，p为黑色点的出现几率。在噪声发生函数generator中，对图像中的每一个像素，产生一个[0,1)的随机数。如果随机数的值小于给定的几率，就加入椒盐噪声到相应的像素上。

\subsubsection{空域滤波器设计}

空域滤波器代码较多，所以不全部打印出来。其思想是：process\_pixel函数根据模板中的权重值，乘以某像素相邻像素的灰度值，产生一组中间结果数组v。然后把该中间结果传送给　process函数，process 函数是规定每一个派生类必须重载的虚函数，来实现具体的滤波器设计。重载的\_\_call\_\_函数，是该系列类具有函数行为，输入原图像，输出滤波后的图像。

process\_pixel函数的输出结果v数组的产生机制:
\begin{equation*}
\mbox{设模板}
m =
\begin{vmatrix}
m_{00}&m_{10}&m_{20}\\
m_{01}&m_{11}&m_{21}\\
m_{02}&m_{12}&m_{22}
\end{vmatrix}
\,
\mbox{像素$p_{x,y}$}
\quad
\begin{matrix}
\ldots & \ldots      & \ldots    & \ldots      & \ldots \\
\ldots & p_{x-1,y-1} & p_{x,y-1} & p_{x+1,y-1} & \ldots \\
\ldots & p_{x-1,y}   & p_{x,y}   & p_{x+1,y}   & \ldots \\
\ldots & p_{x-1,y+1} & p_{x,y+1} & p_{x+1,y+1} & \ldots \\
\ldots & \ldots      & \ldots    & \ldots      & \ldots
\end{matrix}
\end{equation*}
则中间结果
\begin{equation}
\begin{split}
v=(&m_{00}\times p_{x-1,y-1},m_{10}\times p_{x,y-1},m_{20}\times p_{x+1,y-1},\\
   &m_{01}\times p_{x-1,y},m_{11}\times p_{x,y},m_{21}\times p_{x+1,y},\\
   &m_{02}\times p_{x-1,y+1},m_{12}\times p_{x,y+1},m_{22}\times p_{x+1,y+1})
\end{split}
\end{equation}

有了上述空域滤波器基类的基础, 只用设定模板m及编写虚函数process, 即可方便的实现均值和中值滤波器。

二者的模板均为：
\begin{equation*}
\begin{vmatrix}
1&1&1\\
1&1&1\\
1&1&1
\end{vmatrix}
\end{equation*}
均值滤波器 process函数：
\begin{lstlisting}
def process(self,v):
        sum = reduce(lambda a,b:a+b, v)
        m=sum/self.count
        return m
\end{lstlisting}
中值滤波器 process函数：
\begin{lstlisting}
def process(self,v):
        v.sort()
        return v[len(v)/2]
\end{lstlisting}

\subsection{实验结果与分析}

\subsubsection{输出结果}

\begin{longtable}{ll}
\caption{空域滤波} \\
%\toprule
%\multicolumn{2}{c}{空域滤波} \\
%\midrule
%\endfirsthead
%\midrule
%\multicolumn{2}{r}{空域滤波} \\
%\midrule
\endhead
\midrule
\multicolumn{2}{r}{接下页\dots} \\
\endfoot
\endlastfoot
\hline
高斯噪声$\mu=0\,,\sigma=25$ &椒盐噪声$s=0.025\,,p=0.025$ \\
\includegraphics[width=5cm]{../output/Q3_Gaussian_Noise.jpg} &\includegraphics[width=5cm]{../output/Q3_Salt_Pepper_Noise.jpg} \\
\hline
均值滤波器处理高斯噪声　& 均值滤波器处理椒盐噪声\\
\includegraphics[width=5cm]{../output/Q3_Mean_Filter_Gaussian_Noise.jpg} &\includegraphics[width=5cm]{../output/Q3_Mean_Filter_S_P_Noise.jpg} \\
\hline
中值滤波器处理高斯噪声　& 中值滤波器处理椒盐噪声\\
\includegraphics[width=5cm]{../output/Q3_Med_Filter_Gaussian_Noise.jpg} &\includegraphics[width=5cm]{../output/Q3_Med_Filter_S_P_Noise.jpg} \\
%\bottomrule
\end{longtable}

\subsubsection{分析与讨论}

\begin{enumerate}
 \item 噪声发生器达到了预期的效果
 \item 由于添加高斯噪声的均值$\mu=0$，所以均值滤波器能有较好的处理结果。同时中值滤波的效果也较好。
 \item 但是对于椒盐噪声，所加入的都是极亮或极暗的灰度值，与周围像素的灰度值不连续，所以均值滤波器不能滤除这些奇点，只能做到模糊化。
 \item 中值滤波器由于只取中位数的灰度值，所以基本能滤除掉极亮或极暗的灰度值，处理效果较好。
\end{enumerate}




